package com.ty.web.spring.listener;

import com.ty.web.monitor.FileAutoClearMonitor;
import com.ty.web.monitor.ImagesFileMonitor;
import com.ty.web.spring.config.properties.TyProperties;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.filefilter.DirectoryFileFilter;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.FileFilter;
import java.io.Serial;

/**
 * SpringBoot应用启动的监听器
 *
 * @Author Tommy
 * @Date 2024/4/19
 */
@Component
@Slf4j
public class ApplicationListener implements ApplicationRunner {

    @Autowired
    private TyProperties tyProperties;

    /**
     * 项目启动完毕后，执行此方法
     */
    @Override
    public void run(ApplicationArguments args) throws Exception {
        this.loadOpenCV();
        if (tyProperties.getEnableClear()) {
            this.enableClearMonitor();
        }
        this.enableChangedMonitor();
    }

    /**
     * 启用文件自动清理监视器
     */
    void enableClearMonitor() {
        String vcroot = tyProperties.getVrootPath();
        if (StringUtils.isNotBlank(vcroot)) {
            try {
                new FileAutoClearMonitor(new File(vcroot + "Changed"), tyProperties.getFileAmountThreshold(), tyProperties.getBatchDelPercent()).init().start();
            } catch (Exception e) {
                log.error(e.getMessage(), e);
            }
        } else {
            log.warn("请配置视频帧图片根目录。。。");
        }
    }

    /**
     * 启用文件变化监视器
     */
    void enableChangedMonitor() {
        // 获取监控目录列表
        File[] dirs = monitorDirs();

        // 依次启动监视器
        for (File d : dirs) {
            this.start(d);
        }
    }

    /**
     * 获取要监控的目录列表
     */
    File[] monitorDirs() {
        File[] dirs = new File[0];
        if (StringUtils.isNotBlank(tyProperties.getVrootPath())) {
            File baseDir = new File(tyProperties.getVrootPath());
            if (baseDir.exists()) {
                dirs = baseDir.listFiles((FileFilter) new DirectoryFileFilter() {
                    @Serial
                    private static final long serialVersionUID = 4655906659212403666L;

                    @Override
                    public boolean accept(File file) {
                        return super.accept(file) && !file.getName().equalsIgnoreCase("Changed");
                    }
                });
            }
        } else {
            log.warn("请配置视频帧图片根目录。。。");
        }
        return dirs;
    }

    /**
     * 启动目录监视器
     */
    void start(File dir) {
        try {
            new ImagesFileMonitor(dir).init().start();
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
    }

    /**
     * 加载 OpenCV 本地库
     */
    void loadOpenCV() {
        nu.pattern.OpenCV.loadShared();
    }
}
